﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace monitor_server
{
    public delegate void form4enable(bool num, ListViewItem LVI);
    public partial class Form3 : Form
    {

        int preColumn = 0;
        static bool comp = true;
        int count, opened_count;
        ListViewItem[] item;
        int xor_len = 71;
        int xor_login = 38;
        int xor_pass = 51;
        int xor_other = 73;
        int[] n;                                        //Первый байт в записи
        formenable d;
        Form4 form4;
        bool f4 = false;
        public Form3(formenable sender)
        {
            InitializeComponent();
            d = sender;
        }

        class ListViewItemComparer : IComparer
        {
            private int col;
            public ListViewItemComparer(int column)
            {
                if (column == 0)
                    col = 2;
                else
                    col = column;

            }
            public int Compare(object x, object y)
            {
                int ret = 0;
                ret = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
                if (!comp)
                    ret *= -1;
                return ret;
            }
        }

        void func4(bool param, ListViewItem LVi)
        {
            f4 = param;
            if (LVi.Text != "empty")
            {               
                LVi.Text = string.Concat(++count);
                listView1.Items.Add(LVi);
            }
        }

        private void выйтиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            d(false);
            this.Close();
        }        

        private void Form3_Shown(object sender, EventArgs e)           //-----Открываем файл
        {
            string str = "";
            DialogResult result;
            //StreamReader fs = new StreamReader(@"resources\access");
            
            string login_str, pass_str, group_str, name_str, note_str;
            int i, a1, a2, a3, a4, a5;//, ss1, ss2, ss3, ss4, ss5;
            byte[] k = new byte[1];
            
            string s1 = ";";
            string s2 = ".";
            i = s1[0];
            byte b1 = (byte)i;
            i = s2[0];
            byte b2 = (byte)i;            
            listView1.View = View.Details;
            listView1.FullRowSelect = true;            
            listView1.Columns.Add("№");
            listView1.Columns[listView1.Columns.Count - 1].Width = 25;
            listView1.Columns.Add("Фамилия Имя Отчество");
            listView1.Columns[listView1.Columns.Count - 1].Width = 150;
            listView1.Columns.Add("Логин");
            listView1.Columns[listView1.Columns.Count - 1].Width = 100;
            listView1.Columns.Add("Пароль");
            listView1.Columns[listView1.Columns.Count - 1].Width = 100;
            listView1.Columns.Add("Группа");
            listView1.Columns[listView1.Columns.Count - 1].Width = 100;
            listView1.Columns.Add("Примечание");
            listView1.Columns[listView1.Columns.Count - 1].Width = 100;
            this.Enabled = true;
            string access = "";
            while (true)
            {
                try
                {                   
                    access = File.ReadAllText(@"resources\access");
                    break;
                }
                catch (Exception)
                {
                    result = System.Windows.Forms.MessageBox.Show("Файл используется другим процессом", "Ошибка доступа", MessageBoxButtons.RetryCancel);
                    if (result == DialogResult.Retry)
                        continue;
                    else
                    {
                        //fs.Close();
                        this.Dispose();
                        d(false);
                        break;
                    }
                }
            }
            //---------------
            i = 0; count = 0;
            while (count < access.Length-3)
            {
                if (access[count] == b1 && access[count + 1] == b2 && access[count + 2] == b1 && access[count + 3] == b1)
                {
                    count++;
                    i++;
                }
                else
                    count++;
            }
            n = new int[i];
            n[0] = 0;
            a1 = a2 = a3 = a4 = a5 = 0;
            item = new ListViewItem[i];            
            for(count = 0; count < i; count++)
            {                
                //-----------------login-----------------
                
                a1 = Convert.ToInt32(access[n[count]]) ^ xor_len;
                for (int c = 0; c < a1; c++)
                {
                    int kc = (int)access[n[count] + 1 + c] ^ xor_login;
                    str += (char)kc;
                }
                login_str = str;
                str = "";
                //-----------------password---------------
                a2 = Convert.ToInt32(access[a1 + 1 + n[count]]) ^ xor_len;
                for (int c = 0; c < a2; c++)
                {
                    int kc = (int)access[a1 + 1 + n[count] + 1 + c] ^ xor_pass;
                    str += (char)kc;
                }
                pass_str = str;
                str = "";
                //-----------------group-----------------
                a3 = Convert.ToInt32(access[a1 + a2 + 2 + n[count]]) ^ xor_len;
                for (int c = 0; c < a3; c++)
                {
                    int kc = (int)access[a1 + a2 + 2 + n[count] + 1 + c] ^ xor_other;
                    str += (char)kc;
                }                
                if (str == "admi")
                    group_str = "Администратор";
                else
                    group_str = "Пользователь";
                str = "";                
                //-----------------name------------------
                a4 = Convert.ToInt32(access[a1 + a2 + a3 + 3 + n[count]]) ^ xor_len;
                for (int c = 0; c < a4; c++)
                {
                    int kc = (int)access[a1 + a2 + a3 + 3 + n[count] + 1 + c] ^ xor_other;
                    str += (char)kc;
                }                
                name_str = str;
                str = "";
                //-----------------note------------------
                a5 = Convert.ToInt32(access[a1 + a2 + a3 + a4 + 4 + n[count]]) ^ xor_len;                
                for (int c = 0; c < a5; c++)
                {
                    int kc = (int)access[a1 + a2 + a3 + a4 + 4 + n[count] + 1 + c] ^ xor_other;                    
                    str += (char)kc;
                }                
                note_str = str;
                str = "";
                //------------next first byte-----------
                if (count != i - 1)
                {
                    n[count + 1] = a1 + a2 + a3 + a4 + a5 + 9 + n[count];
                }
                item[count] = new ListViewItem(string.Concat(count + 1));
                item[count].SubItems.Add(name_str);
                item[count].SubItems.Add(login_str);
                item[count].SubItems.Add(pass_str);
                item[count].SubItems.Add(group_str);
                item[count].SubItems.Add(note_str);
                listView1.Items.Add(item[count]);
            }
            opened_count = count;
                       
            //---------------
        }

        private void добавитьЗаписьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!f4)
            {
                form4 = new Form4(new form4enable(func4));
                f4 = true;
                form4.Owner = this;
                form4.Show();
            }
            else
                MessageBox.Show("Окно редактирования уже открыто.");
        }

        

        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            if (!(preColumn != e.Column && !((e.Column == 0 || e.Column == 1) && (preColumn == 0 || preColumn == 1))))
                comp = !comp;
            preColumn = e.Column;
            listView1.ListViewItemSorter = new ListViewItemComparer(e.Column);
            for (int i = 0; i < count; i++)
                listView1.Items[i].Text = string.Concat(listView1.Items[i].Index);
        }

        private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)           //Сохранение
        {
            File.Copy(@"resources\access", @"resources\access_backup");
            try 
            {
                File.Delete(@"resources\access");
            }
            catch(Exception)
            {
                MessageBox.Show("Невозможно получить доступ к файлу.");
                File.Delete(@"resources\access_backup");
                return;
            }
            int k, a, i, j;            
            string str = "";
            string wr = "";
            //StreamWriter fs = new StreamWriter(@"resources\access");
                   
            for (i = 0; i < count; i++)
            {
                //---------------Login-----------------
                a = ((ListViewItem)listView1.Items[i]).SubItems[2].Text.Length ^ xor_len;
                wr += Convert.ToChar(a);
                for (j = 0; j < ((ListViewItem)listView1.Items[i]).SubItems[2].Text.Length; j++)
                {
                    k = ((ListViewItem)listView1.Items[i]).SubItems[2].Text[j];
                    k = k ^ xor_login;
                    wr += Convert.ToChar(k);
                }
                //---------------Password-----------------
                a = ((ListViewItem)listView1.Items[i]).SubItems[3].Text.Length ^ xor_len;
                wr += Convert.ToChar(a);
                for (j = 0; j < ((ListViewItem)listView1.Items[i]).SubItems[3].Text.Length; j++)
                {
                    k = ((ListViewItem)listView1.Items[i]).SubItems[3].Text[j];
                    k = k ^ xor_pass;
                    wr += Convert.ToChar(k);
                }
                //----------------Group--------------------
                a = 4 ^ xor_len;
                wr += Convert.ToChar(a);
                switch (((ListViewItem)listView1.Items[i]).SubItems[4].Text)
                {
                    case "Администратор":
                        str = "admi";
                        break;
                    case "Пользователь":
                        str = "user";
                        break;
                }
                for (j = 0; j < 4; j++)
                {
                    k = str[j];
                    k = k ^ xor_other;
                    wr += Convert.ToChar(k);
                }
                //----------------Name--------------------
                a = ((ListViewItem)listView1.Items[i]).SubItems[1].Text.Length ^ xor_len;
                wr += Convert.ToChar(a);
                for (j = 0; j < ((ListViewItem)listView1.Items[i]).SubItems[1].Text.Length; j++)
                {
                    k = ((ListViewItem)listView1.Items[i]).SubItems[1].Text[j];
                    k = k ^ xor_other;
                    wr += Convert.ToChar(k);
                    
                }
                //-----------------Note------------------
                a = ((ListViewItem)listView1.Items[i]).SubItems[5].Text.Length ^ xor_len;
                wr += Convert.ToChar(a);
                for (j = 0; j < ((ListViewItem)listView1.Items[i]).SubItems[5].Text.Length; j++)
                {
                    k = ((ListViewItem)listView1.Items[i]).SubItems[5].Text[j];
                    k = k ^ xor_other;
                    wr += Convert.ToChar(k);
                    
                }
                wr += ";.;;";
                
            }
            File.WriteAllText(@"resources\access", wr);
            File.Delete(@"resources\access_backup");
            MessageBox.Show("Сохранение успешно завершено.");
        }

        private void удалитьЗаписьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Чтобы удалить запись, дважды щелкните по строке с необходимой записью.");
        }

        private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            DialogResult res;
            res = System.Windows.Forms.MessageBox.Show("Вы действительно хотите удалить запись о пользователе " + ((ListViewItem)listView1.FocusedItem).SubItems[1].Text + "?", "", MessageBoxButtons.OKCancel);
                    if (res == DialogResult.Cancel)
                        return;
            listView1.FocusedItem.Remove();
            count--; 
        }
    }
}
